package com.ecarx.camera.worker.camera.dvr;

import com.ecarx.camera.constant.Constants;
import com.ecarx.camera.data.ThumbnailData;

/**
 * Dvr接口定义
 */
public interface IDvrAPI {

    /**
     * 初始化
     */
    void init();

    /**
     * 销毁
     */
    void destroy();

    /**
     * 注册Dvr状态监听
     * @param watcher
     * @return
     */
    boolean registerDvrStateWatcher(IDvrStateWatcher watcher);

    /**
     * 取消注册Dvr状态监听
     * @param watcher
     */
    void unregisterDvrStateWatcher(IDvrStateWatcher watcher);

    /**
     * 注册Sdcard状态监听
     * @param watcher
     * @return
     */
    boolean registerSdcardStateWatcher(ISdcardStateWatcher watcher);

    /**
     * 取消注册Sdcard状态监听
     * @param watcher
     */
    void unregisterSdcardStateWatcher(ISdcardStateWatcher watcher);

    /**
     * 注册操作结果监听
     * @param watcher
     * @return
     */
    boolean registerOperateResultsWatcher(IOperateResultsWatcher watcher);

    /**
     * 取消注册操作结果监听
     * @param watcher
     */
    void unregisterOperateResultsWatcher(IOperateResultsWatcher watcher);

    /**
     * 打开Dvr
     */
    boolean openDvr();

    /**
     * 退出Dvr
     */
    boolean exitDvr();

    /**
     * 开始一般循环录像
     * @return
     */
    boolean startGeneralRecord();

    /**
     * 开始紧急录像
     * @return
     */
    boolean startEmergencyRecord();

    /**
     * 暂停一般循环录像
     * @return
     */
    boolean pauseGeneralRecord();

    /**
     * 拍照
     * @return
     */
    boolean doCapture();

    /**
     * Dvr恢复出厂设置
     * @return
     */
    boolean doDvrFactoryReset();

    /**
     * 格式化Dvr的Sdcard
     * @return
     */
    boolean doDvrSdcardFormat();

    /**
     * 激活IPLM唤醒RG4（唤醒以太网，使DHU与DVR之间可以通过http访问）
     * @return
     */
    boolean wakeupEthernet();

    /**
     * 判断Dvr的Sdcard是否存在
     * @return
     */
    boolean isDvrSdcardExists();

    /**
     * 判断是否正在一般循环录像中
     * @return
     */
    boolean isDvrGeneralRecording();

    /**
     * 判断是否正在紧急录像中
     * @return
     */
    boolean isDvrEmergencyRecording();

    /**
     * Dvr缩略图接口定义
     */
    interface IDvrThumbnailAPI {
        /**
         * 获取Dvr最近拍照或录像的缩略图
         * @return
         */
        ThumbnailData getDvrLatestThumbnail();
    }

    /**
     * Dvr相关配置接口定义
     */
    interface IDvrConfigAPI {
        /**
         * 是否支持Dvr设备
         * @return
         */
        boolean isDvrDeviceSupported();

        /**
         * 获取一般循环录像分辨率
         * @return （480: 480p；720: 720p 30fps；1080: 1080p, 30fps）
         */
        int getDvrGeneralRecordResolution();

        /**
         * 获取一般循环录像时长
         * @return （1：1 minutes；3：3 minutes；5：5 minutes）
         */
        int getDvrGeneralRecordDuration();

        /**
         * 获取一般循环录像Mic的静音状态
         * @return true为静音；false为非静音
         */
        boolean getDvrGeneralRecordMicMute();

        /**
         * 设置一般循环录像分辨率
         * @param resolution （480: 480p；720: 720p 30fps；1080: 1080p, 30fps）
         * @return
         */
        boolean setDvrGeneralRecordResolution(@Constants.LoopRecordResolution int resolution);

        /**
         * 设置一般循环录像时长
         * @param duration （1：1 minutes；3：3 minutes；5：5 minutes）
         * @return
         */
        boolean setDvrGeneralRecordDuration(@Constants.LoopRecordDuration int duration);

        /**
         * 设置一般循环录像Mic的静音状态
         * @param mute
         * @return
         */
        boolean setDvrGeneralRecordMicMute(boolean mute);

        /**
         * 获取Dvr软件版本
         * @return
         */
        String getDvrSoftWareVersion();

        /**
         * 获取Dvr硬件版本
         * @return
         */
        String getDvrHardWareVersion();

        /**
         * SD卡已使用百分比(0-100%)
         * @return
         */
        int getSdcardUsedPercentage();

        /**
         * 注册Dvr配置变化的监听
         * @param watcher
         * @return
         */
        boolean registerDvrConfigWatcher(IDvrConfigWatcher watcher);

        /**
         * 取消注册Dvr配置变化的监听
         * @param watcher
         */
        void unregisterDvrConfigWatcher(IDvrConfigWatcher watcher);
    }

    /**
     * Dvr配置回调接口
     */
    interface IDvrConfigWatcher {
        /**
         * Dvr一般循环录像的分辨率变化的回调
         * @param resolution
         */
        void onDvrGeneralRecordResolutionChanged(@Constants.LoopRecordResolution int resolution);

        /**
         * Dvr一般循环录像的时长变化的回调
         * @param duration
         */
        void onDvrGeneralRecordDurationChanged(@Constants.LoopRecordDuration int duration);

        /**
         * Dvr一般循环录像的Mic静音状态变化的回调
         * @param mute true为静音；false为非静音
         */
        void onDvrGeneraRecordMicMuteChanged(boolean mute);

        /**
         * Dvr SD卡已使用百分比(0-100%)变化的回调
         * @param percentage
         */
        void onDvrSdcardUsedPercentageChanged(int percentage);
    }

    /**
     * Dvr状态回调接口
     */
    interface IDvrStateWatcher {
        /**
         * Dvr状态回调：初始化
         */
        void onDvrStateInitializing();

        /**
         * Dvr状态回调：拍照
         */
        void onDvrStateCapturePic();

        /**
         * Dvr状态回调：一般循环录像中
         */
        void onDvrStateGeneralRecording();

        /**
         * Dvr状态回调：一般循环录像暂停
         */
        void onDvrStateGeneralRecordPause();

        /**
         * Dvr状态回调：紧急录像中
         */
        void onDvrStateEmergencyRecording();

        /**
         * Dvr状态回调：视频采集系统故障
         */
        void onDvrStateCameraConnectionLost();

        /**
         * Dvr状态回调：录像失败,无法进行录像和拍照,可以进行回放
         */
        void onDvrStateVideoRecordFailure();

        /**
         * Dvr状态回调：Network abnormal，行车记录仪出现异常,部分功能受限
         */
        void onDvrStateNetworkAbnormal();

        /**
         * Dvr状态回调：Acceleration sensor abnormal，行车记录仪出现异常,部分功能受限
         */
        void onDvrStateAccelerationSensorAbnormal();

        /**
         * Dvr状态回调：memory read error，行车记录仪系统错误,无法正常工作
         */
        void onDvrStateMemoryReadError();

        /**
         * Dvr状态回调：memory write error，行车记录仪系统错误,无法正常工作
         */
        void onDvrStateMemoryWriteError();

        /**
         * Dvr状态回调：system error，行车记录仪系统错误,无法正常工作
         */
        void onDvrStateSystemError();

        /**
         * Dvr状态回调：全景影像错误
         */
        void onDvrState360ViewsModuleError();

        /**
         * Dvr状态回调：行车记录仪过热,无法正常工作,散热完毕后将重启
         */
        void onDvrStateOverHead();

        /**
         * Dvr状态回调：行车记录仪资源被占用,暂时无法操作
         */
        void onDvrStateResourceOccupied();

        /**
         * Dvr状态回调：行车记录TF卡写速变慢,建议格式化卡片恢复速度
         */
        void onDvrStateSdcardStatusPoorWritePerformance();

        /**
         * Dvr状态回调：行车记录仪电压异常,无法正常工作,电压恢复正常范围后将重启
         */
        void onDvrStateVoltageAbnormal();

        /**
         * Dvr状态回调：未知错误
         */
        void onDvrStateUnknownError();

        /**
         * Dvr状态回调：紧急录像结束
         */
        void onDvrStateEmergencyRecordEnd();

        /**
         * Dvr EMMC状态回调：EMMC状态正常
         */
        void onDvrEMMCStateNormal();

        /**
         * Dvr EMMC状态回调：EMMC故障，需提示"⾏⻋记录仪内置存储器故障，请及时维修"
         */
        void onDvrEMMCStateError();

        /**
         * Dvr状态回调：无错误
         */
        void onDvrNoError();
    }

    /**
     * Sdcard状态回调接口
     */
    interface ISdcardStateWatcher {

        /**
         * Sdcard状态回调：未知
         */
        void onSdcardStateUnknown();

        /**
         * Sdcard状态回调：正常
         */
        void onSdcardStateNormal();

        /**
         * Sdcard状态回调：SD卡不存在
         */
        void onSdcardStateNoSdcard();

        /**
         * Sdcard状态回调：SD卡出错
         */
        void onSdcardStateError();

        /**
         * Sdcard状态回调：SD卡无法侦测或初始化
         */
        void onSdcardStateInitializeFail();

        /**
         * Sdcard状态回调：SD卡写入性能差
         */
        void onSdcardStatePoorWritePerformance();

        /**
         * Sdcard状态回调：SD卡未格式化
         */
        void onSdcardStateNotFormatted();

        /**
         * Sdcard状态回调：SD卡格式化中
         */
        void onSdcardStateFormatting();

        /**
         * Sdcard状态回调：SD卡容量耗尽
         */
        void onSdcardStateNoSpace();

        /**
         * Sdcard状态回调：SD卡无法写入
         */
        void onSdcardStateWriteFail();

        /**
         * Sdcard状态回调：SD卡不合规格, 需要使用32GB以上且速度class 10以上的卡
         */
        void onSdcardStateSdcardIncompatible();

        /**
         * Sdcard状态回调：SD卡紧急录像目录空间不足，紧急录像目录使用率大于总空间30%
         */
        void onSdcardStateEmergencyAreaOverThreshold();

        /**
         * Sdcard状态回调：SD卡用户私有文件占用超过10%，无法进行任何录影和拍照，需要删除多余私有文件
         */
        void onSdcardStatePrivateFilesTakeTooMuchSpace();

        /**
         * Sdcard状态回调：紧急录像分区满
         */
        void onSdCardStateEmergencyVideoPartitionFull();

        /**
         * Sdcard状态回调：照片分区满
         */
        void onSdCardStatePhotoPartitionFull();
    }

    /**
     * 操作结果的回调接口
     */
    interface IOperateResultsWatcher {

        /**
         * 操作结果回调：拍照进行中
         */
        void onDvrCaptureInProgress();

        /**
         * 操作结果回调：拍照成功
         */
        void onDvrCaptureSuccess();

        /**
         * 操作结果回调：拍照失败
         */
        void onDvrCaptureFail();

        /**
         * 操作结果回调：一般循环录像进行中
         */
        void onDvrGeneralRecordInProgress();

        /**
         * 操作结果回调：一般循环录像成功
         */
        void onDvrGeneralRecordSuccess();

        /**
         * 操作结果回调：一般循环录像失败
         */
        void onDvrGeneralRecordFail();

        /**
         * 操作结果回调：暂停一般循环录像进行中
         */
        void onDvrPauseGeneralRecordInProgress();

        /**
         * 操作结果回调：暂停一般循环录像成功
         */
        void onDvrPauseGeneralRecordSuccess();

        /**
         * 操作结果回调：暂停一般循环录像失败
         */
        void onDvrPauseGeneralRecordFail();

        /**
         * 操作结果回调：紧急录像进行中
         */
        void onDvrEmergencyRecordInProgress();

        /**
         * 操作结果回调：紧急录像成功
         */
        void onDvrEmergencyRecordSuccess();

        /**
         * 操作结果回调：紧急录像失败
         */
        void onDvrEmergencyRecordFail();

        /**
         * 操作结果回调：恢复出厂进行中
         */
        void onFactoryResetInProgress();

        /**
         * 操作结果回调：恢复出厂成功
         */
        void onFactoryResetSuccess();

        /**
         * 操作结果回调：恢复出厂失败
         */
        void onFactoryResetFail();

        /**
         * 操作结果回调：Sdcard格式化进行中
         */
        void onSdcardFormatInProgress();

        /**
         * 操作结果回调：Sdcard格式化成功
         */
        void onSdcardFormatSuccess();

        /**
         * 操作结果回调：Sdcard格式化失败
         */
        void onSdcardFormatFail();

        /**
         * 操作结果回调：未知
         */
        void onOperationUnknown();
    }
}
